package com.store.bookstore_backend.Util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;

public class JwtUtil {

    // 使用安全的秘钥生成工具
    //动态密钥，每次服务器重启都会改变
    //    private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    // 固定秘钥字符串（建议从配置文件中读取）
    private static final String SECRET_KEY_STRING = "mJQ3U6yQ5FhZ5mH1hJ4s9K8m5vY3mV2p3dXlK7hK9vQ=";
    private static final SecretKey SECRET_KEY = new SecretKeySpec(Base64.getDecoder().decode(SECRET_KEY_STRING), "HmacSHA256");


    // 定义Token有效期 (单位：毫秒)
    private static final long EXPIRATION_TIME = 1000 * 60 * 60 * 24; // 1天

    /**
     * 生成JWT Token
     *
     * @param userId 用户ID
     * @return JWT字符串
     */
    public static String generateToken(Long userId) {
        return Jwts.builder()
                .setSubject(String.valueOf(userId))  // 设置主题（通常是用户ID）
                .setIssuedAt(new Date())            // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
                .signWith(SECRET_KEY, SignatureAlgorithm.HS256)  // 使用秘钥和签名算法
                .compact();
    }

    /**
     * 解析JWT Token，获取Claims
     *
     * @param token JWT字符串
     * @return Claims
     */
    public static Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)         // 设置秘钥
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 验证Token并获取用户ID
     *
     * @param token JWT字符串
     * @return 用户ID
     */
    public static Long getUserIdFromToken(String token) {
        Claims claims = parseToken(token);
        return Long.parseLong(claims.getSubject());
    }
}
